// 花神游历各国（牛客 NC50456）
// 陈锋
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

//数组大小以及数据类型，抽象成泛型
template <typename T = int, int SZ = 10004>
struct SegTree {
  struct Node { T max, sum; };
  Node NS[SZ * 3];
  int qL, qR;
  void init(int o, int L, int R, const T* A) {  //初始化操作
    assert(o < 3 * SZ);
    Node& nd = NS[o];
    if (L == R) {  //叶子区间
      nd.max = nd.sum = A[L];
      return;
    }
    int M = L + (R - L) / 2, lc = 2 * o, rc = 2 * o + 1;
    init(lc, L, M, A), init(rc, M + 1, R, A);  //左右区间分别初始化
    nd.max = max(NS[lc].max, NS[rc].max), nd.sum = NS[lc].sum + NS[rc].sum;
  }

  T querySum(int o, int L, int R) {  //查询区间和
    const Node& nd = NS[o];
    if (qL <= L && qR >= R) return nd.sum;
    int M = (L + R) / 2, lc = 2 * o, rc = 2 * o + 1;
    T ans = 0;
    if (qL <= M) ans += querySum(lc, L, M);     //左子区间
    if (qR > M) ans += querySum(rc, M + 1, R);  //右子区间
    return ans;
  }

  void make_sqrt(int o, int L, int R) {
    Node& nd = NS[o];
    if (nd.max <= 1) return;  // sqrt多次之后就会变成1，之后不用再更新
    if (L == R) {             //叶子
      nd.max = floor(sqrt(nd.max)), nd.sum = floor(sqrt(nd.sum));
      return;
    }
    int M = (L + R) / 2, lc = 2 * o, rc = 2 * o + 1;
    if (qL <= M) make_sqrt(2 * o, L, M);         //覆盖左半边
    if (qR > M) make_sqrt(2 * o + 1, M + 1, R);  //覆盖右半边
    //左右都更新，max和sum也要更新
    nd.max = max(NS[lc].max, NS[rc].max), nd.sum = NS[lc].sum + NS[rc].sum;
  }
};

const int NN = 1e5 + 4;
SegTree<LL, NN> st;
int N, M;
LL A[NN];
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  cin >> N;
  for (int i = 1; i <= N; i++) cin >> A[i];
  st.init(1, 1, N, A);
  cin >> M;
  for (int i = 1, x, l, r; i <= M; i++) {
    cin >> x >> st.qL >> st.qR;
    if (x == 1)
      cout << st.querySum(1, 1, N) << endl;
    else
      st.make_sqrt(1, 1, N);
  }

  return 0;
}
/*
  注意一个区间的元素在全部变成1之后，再进行开方操作就无任何效果。
*/
// 46046090 花神游历各国 答案正确 100 283 5992 1814 C++ 2020-12-13 21:10:38